class ChessPieces{
    id=null;
    type=null;
    user=0;
    x=0;
    y=0;
    text=null;
    chess=null;
    chessBoard=null;
    constructor(chessBoard,ele){
        this.chessBoard=chessBoard;
        this.x=ele.x;
        this.y=ele.y;
        this.setChessId(ele.id);
    };

    setChessId(chessId){
        let id=chessId;
        this.id=chessId;
        if(id!=null){//非空格子
            this.text=this.chessBoard.getChessName(id);
            if(id>=16){
                id=id-16;
                this.user=2;
            }else{
                this.user=1;
            }
            if(id==0){ //将
                this.type=0;
            }else if(id<=10){ //士 像 马 车 炮
                this.type=parseInt((id+1)/2)
            }else{ //兵
                this.type=6
            }
        }else{
            //this.chess=null;
            this.text=this.chessBoard.getChessName(id);
            this.user=0;
            this.type=null;
        }
    }

    getChess(x,y){
        return this.chessBoard.getChess(x,y);
    }

    setChess(chess){
        this.chess=chess;
    }

    eatOrMove(terget){
        if(terget.id!=null && terget.user==this.user){//吃自己子的情况,空棋子判断已经前面处理
            return false;
        }else{
            this.chessBoard.setNewChess(this,terget);
            return true;
        }
    };

    general(terget){//帅
        if(this.type!=0){ //判断类型
            return false;
        }
        if(Math.abs(terget.x-this.x)+Math.abs(terget.y-this.y)!=1){ //步长
            return false;
        }
        if(3>terget.x || terget.x>5 || (3<terget.y && terget.y <7)){ //范围
            return false;
        }
        return true;
    }


    bodyguard(terget){//士
        if(this.type!=1){ //判断类型
            return false;
        }
        if(Math.abs(terget.x-this.x)!=1 || Math.abs(terget.y-this.y)!=1){ //步长
            return false;
        }
        if(3>terget.x || terget.x>5 || (3<terget.y && terget.y <7)){ //范围
            return false;
        }
        return true;
    }

    elephant(terget){//象
        if(this.type!=2){ //判断类型
            return false;
        }
        if(Math.abs(terget.x-this.x)!=2 || Math.abs(terget.y-this.y)!=2){ //步长
            return false;
        }
        if((this.y>4) != (terget.y>4)){ //范围
            return false;
        }
        if(this.chessBoard.existChess((terget.x+this.x)/2,(terget.y+this.y)/2)){//挡路
            return false;
        }
        return true;
    }

    horse(terget){//马
        if(this.type!=3){ //判断类型
            return false;
        }
        if(Math.pow(terget.x-this.x,2) + Math.pow(terget.y-this.y,2) !=5){ //步长
            return false;
        }
        if(this.chessBoard.existChess(Math.round((terget.x+this.x)/2),Math.round((terget.y+this.y)/2))){//挡路
            return false;
        }
        return true;
    }

    pig(terget){//车
        if(this.type!=4){ //判断类型
            return false;
        }
        if(Math.abs(terget.x-this.x) * Math.abs(terget.y-this.y)!=0){ //步长
            return false;
        }
        if(this.chessBoard.countChess(this,terget)!=0){//挡路
            return false;
        }
        return true;
    }

    gun(terget){//炮
        if(this.type!=5){ //判断类型
            return false;
        }
        if(Math.abs(terget.x-this.x) * Math.abs(terget.y-this.y)!=0){ //步长
            return false;
        }
        let count=this.chessBoard.countChess(this,terget);
        if(count>1){//挡路
            return false;
        }
        if(count==0 && terget.id!=null){//没隔子不能吃子
            return false;
        }
        if(count==1 && terget.id==null){//吃子情况 至于是不是自己的,留着吃子判断
            return false;
        }
        return true;
    }
 
    soldier(terget){//兵
        if(this.type!=6){ //判断类型
            return false;
        }
        if(Math.abs(terget.x-this.x)+Math.abs(terget.y-this.y)!=1){ //步长
            return false;
        }
        if(Math.abs(terget.y-this.y)==1 && (terget.y<this.y) == (this.id<=16)){ //范围 y方向不能倒退
            return false;
        }
        if(Math.abs(terget.x-this.x)==1 && (this.y<=4) == (this.id<=16)){ //范围 x过河才能随便走
            return false;
        }

        return true;
    }

    moveTo(terget){
        if(this.id==null){//当前没子的情况
            return false;
        }
        if(this.x==terget.x && this.y==terget.y){//没移动情况
            return false;
        }

        return (this.general(terget) || this.bodyguard(terget) || this.elephant(terget) || this.horse(terget)
            || this.pig(terget) || this.gun(terget) || this.soldier(terget)) && this.eatOrMove(terget);

    }

    toData(){
        return {
            x:this.x,
            y:this.y,
            id:this.id,
        }
    }
}
export default ChessPieces;